package com.victor.controller;

import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sun.org.apache.regexp.internal.recompile;
import com.victor.entity.JMInfo;
import com.victor.entity.step.Schedule;
import com.victor.entity.step.Step;
import com.victor.entity.step.StepDetails;
import com.victor.service.StepService;
import com.victor.utils.Msg;

import net.bytebuddy.asm.Advice.Return;

/**
 * 入驻审批流程管理
 * 
 * @author zhangbin
 *
 */
@RestController
@RequestMapping("/step")
public class StepController {

	@Autowired
	private StepService service;

	// 查询现有的流程
	@RequestMapping("/getAllStep")
	public Msg getAllStep() {
		List<Step> steps = service.getAllStep();
		return Msg.success().add("steps", steps);
	}

	// 新建流程模板
	@RequestMapping("/buildStep")
	public Msg buildStep(@RequestBody Step step) {

		// 创建模板信息
		boolean insStep = service.buildStep(step);
		if (insStep) {
			// 创建模板流程
			List<StepDetails> stepDetailss = step.getStepDetails();
			if (stepDetailss != null && stepDetailss.size() > 0) {
				for (StepDetails stepDetails : stepDetailss) {
					// 讲流程id放入流程模板中
					stepDetails.setS_id(step.getS_id());
					service.addStepDetails(stepDetails);
				}
			}
			return Msg.success();
		}
		return Msg.fail();
	}

	// 批量删除流程模板
	@RequestMapping("/batchDeleteStep")
	public Msg batchDeleteStep(int[] s_ids, String adminid) {
		boolean delResult = service.batchDeleteStep(s_ids);
		if (delResult) {
			// 添加操作日志
			return Msg.success();
		}
		return Msg.fail();
	}

	// 修改流程
	@RequestMapping("/updateStep")
	public Msg updateStep(@RequestBody Step step) {
		// 将id转为数组
		int s_id = step.getS_id();
		int[] s_idarr = new int[1];
		s_idarr[0] = s_id;
		service.batchDeleteStep(s_idarr);
		// 创建模板信息
		boolean insStep = service.buildStep(step);
		if (insStep) {
			// 创建模板流程
			List<StepDetails> stepDetailss = step.getStepDetails();
			if (stepDetailss != null && stepDetailss.size() > 0) {
				for (StepDetails stepDetails : stepDetailss) {
					// 讲流程id放入流程模板中
					stepDetails.setS_id(step.getS_id());
					service.addStepDetails(stepDetails);
				}
			}
			return Msg.success();
		}
		return Msg.fail();
	}

	/**
	 * 	分配到模板
	 * 	@param JMInfo  加盟实体类
	 * 	@param Step  应用模板
	 */
	@RequestMapping("/allotStep")
	public Msg allotStep(JMInfo jmInfo,Step step) {
		//查询该模板下流程详细表
		List<StepDetails> list = service.getStepDetailsByS_id(step.getS_id());
		for (int i = 0; i < list.size(); i++) {
			Schedule schedule = new Schedule();
			schedule.setInfo_id(jmInfo.getId()+"");// 赋值加盟实体类id 
			schedule.setS_id(step.getS_id()+"");//应用模板id
			schedule.setPd_empid(jmInfo.getEmp_id());//派单人id
			schedule.setSp_empid(list.get(i).getEmpid());//审批人id 
			if ((jmInfo.getEmp_id()).equals(list.get(i).getEmpid())) {
				schedule.setPersonal_status("0");//派单人,审批人同一人设置个人审批状态(0我发起的)
			}else if (list.get(i).getPosition()==1) {
				schedule.setPersonal_status("2");//此流程排在第1，设置个人审批状态(2待我审批)
			}else {
				schedule.setPersonal_status("1");//最后设置个人审批状态(1参与审批未到我审批)
			}
			schedule.setSp_sequence(list.get(i).getPosition()+"");//设置审批顺序
			//分配模板
			boolean b = service.allotStep(schedule);
			if (!b) {
				return Msg.fail("添加审核进度失败");
			}
		}
		//分配成功修改加盟状态 （1分配正在审核流程中）
		boolean c = service.updateStatus(jmInfo.getId());
		return Msg.judge(c);
	}
	
	/**
	 * 	查询 (待我审批) 审核进度
	 * @param empid 登录员工id
	 * @return
	 */
	@RequestMapping("/getInfoById")
	public Msg selfSPById(String empid) {
		//查询该登录员工待审批的审核进度
		List<Schedule> list = service.selfSPById(empid);
		if (list==null || list.size()==0) {
			return Msg.success().add("key", "没有待我审批");
		}
		for (int i = 0; i < list.size(); i++) {
			JMInfo jmInfo = service.getInfoById(Integer.parseInt(list.get(i).getInfo_id()));
			list.get(i).setJmInfo(jmInfo);
		}
		return Msg.success().add("list", list);
	}
	
	/**
	 *	 查询 (我参与的审批) 
	 * @param empid 登录员工id
	 * @return
	 */
	@RequestMapping("/selfSPJoinById")
	public Msg selfSPJoinById(String empid) {
		if (empid==null || empid.equals("")) {
			return Msg.fail("参数错误");
		}
		List<Schedule> list = service.selfSPJoinById(empid);
		if (list==null || list.size()==0) {
			return Msg.success().add("key", "没有待审批");
		}
		for (int i = 0; i < list.size(); i++) {
			JMInfo jmInfo = service.getInfoById(Integer.parseInt(list.get(i).getInfo_id()));
			list.get(i).setJmInfo(jmInfo);
		}
		return Msg.success().add("list", list);
	}

	/**
	 * 	同意审批 （状态为2的改为3  查询下一流程   将下一流程的状态1改为2）
	 * @param id 进程id
	 * @param info_id 加盟实体类id
	 * @param sp_sequence 审批顺序
	 */
	@RequestMapping("/pass")
	public Msg pass(Schedule schedule) {
		//同意审批 将状态为2的改为3 
		boolean b = service.pass(schedule.getId());
		if (!b) {
			return Msg.fail("同意审批失败");
		}
		//查询下一审核进度id
		Integer id = service.selectIdBySpsequence(Integer.parseInt(schedule.getSp_sequence())+1+"",schedule.getInfo_id());
		if (id==null) {
			//修改加盟类状态为（2审核完成未上传合同）
			boolean a = service.updateJMinfoById(Integer.parseInt(schedule.getInfo_id()));
			if (!a) {
				return Msg.fail();
			}
			return Msg.success();
		}
		//修改下一审批人的个人审批状态
		boolean s = service.updateNextPersonStatus(id);
		return Msg.judge(s);
	}

	/**
	 * 	 拒绝审批
	 * @param id 当前进度id
	 * @param info_id 审核进度表中加盟实体类id
	 * @param not_pass_reason 拒绝信息
	 * @return
	 */
	@RequestMapping("/no")
	public Msg no(Schedule schedule) {
		boolean b = service.no(schedule.getId(),schedule.getNot_pass_reason());
		if (!b) {
			return Msg.fail("拒绝审批失败");
		}
		//修改入住审批实体类状态为4审核未通过
		boolean c = service.noPassJminfo(Integer.parseInt(schedule.getInfo_id()));
		return Msg.judge(c);
	}
	
	
	/**
	 * 	 批量导出流程模板
	 * @param ids 流程表模板id
	 * @param request
	 * @param response
	 * @throws Exception
	 */
//	@RequestMapping("/batchExport")
//	public void batchExport(int[] ids,HttpServletRequest request,HttpServletResponse response) throws Exception {
//		//数据库查询数据 exportlist 需要导出的list
//		List<Step> list = service.getStepList(ids);
//		// 创建poi导出数据对象
//		SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
//		// 创建sheet页
//		Sheet sheet = sxssfWorkbook.createSheet("流程模板");
//
//		CellRangeAddress region1 = new CellRangeAddress(0, 1, (short) 0, (short) 8);
//		// 参数1：起始行 参数2：终止行 参数3：起始列 参数4：终止列
//		sheet.addMergedRegion(region1);
//		Row headTitle = sheet.createRow(0);
//		headTitle.createCell(0).setCellValue("流程模板");
//
//		// 创建表头
//		Row headRow = sheet.createRow(5);
//		// 设置表头信息
//		headRow.createCell(0).setCellValue("流程编号");
//		headRow.createCell(1).setCellValue("流程名称");
//		headRow.createCell(2).setCellValue("流程创建员工id");
//
//		// 遍历上面数据库查到的数据
//		for (JMInfo l : list) {
//			Row dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
//			dataRow.createCell(0).setCellValue(l.getId());
//			dataRow.createCell(1).setCellValue(l.getDate());
//			dataRow.createCell(2).setCellValue(l.getLinkman());
//			dataRow.createCell(3).setCellValue(l.getPhone());
//		}
//		// 下载导出文件名
//		String filename = "入驻审批流程模板";
//		// 设置头信息
//		response.setCharacterEncoding("UTF-8");
//		response.setContentType("application/vnd.ms-excel");
//		// 一定要设置成xlsx格式
//		response.setHeader("Content-Disposition",
//				"attachment;filename=" + URLEncoder.encode(filename + ".xlsx", "UTF-8"));
//		// 创建一个输出流
//		ServletOutputStream outputStream = response.getOutputStream();
//		// 写入数据
//		sxssfWorkbook.write(outputStream);
//		// 关闭
//		outputStream.close();
//		sxssfWorkbook.close();
//	}
	
}
